MENTOR_STUDY 참여 여부 필터링 버그 수정#556
Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughMyParticipatingStudiesSection의 Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 분 Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@src/components/group-study/section/my-participating-studies-section.tsx`:
- Around line 66-70: The current re-filtering using CLASSIFICATION_TO_STUDY_TYPE
and study.type (in the block that builds `filtered` from
`myStudiesData.content`) can exclude legacy items (e.g., type='MENTORING');
remove this additional `study.type === studyType` filter and instead derive
`participatingStudyIds` directly from `myStudiesData.content` (or use the
API-provided classification/studyType that was sent) so all returned content is
preserved; update any downstream usage that references `filtered` to use the
full `myStudiesData.content` (or a properly mapped version) and keep references
to `CLASSIFICATION_TO_STUDY_TYPE`, `studyType`, `myStudiesData.content`, and
`participatingStudyIds` to locate the change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: ead97ffc-ef27-47f0-8d44-60e06c7be3d4
📒 Files selected for processing (1)
src/components/group-study/section/my-participating-studies-section.tsx
| const studyType = CLASSIFICATION_TO_STUDY_TYPE[classification]; | ||
|
|
||
| const filtered = myStudiesData.content.filter( | ||
| (study) => | ||
| (study.status === 'IN_PROGRESS' || study.status === 'RECRUITING') && | ||
| study.type === studyType, | ||
| (study) => study.type === studyType, | ||
| ); |
There was a problem hiding this comment.
type 재필터링이 남아 있어 레거시 참여 스터디가 다시 누락될 수 있습니다.
studyType는 이미 API 요청에서 전달되고 있으므로, 여기서 study.type을 다시 비교하면 레거시 값(MENTORING) 케이스가 제외될 수 있습니다. participatingStudyIds는 응답 content 전체에서 바로 구성하는 쪽이 안전합니다.
수정 제안
- const studyType = CLASSIFICATION_TO_STUDY_TYPE[classification];
-
- const filtered = myStudiesData.content.filter(
- (study) => study.type === studyType,
- );
-
- return new Set(filtered.map((study) => study.studyId));
+ return new Set(myStudiesData.content.map((study) => study.studyId));Based on learnings: In code-zero-to-one/study-platform-client, existing DB records include classification='GROUP_STUDY' with type='MENTORING', so strict frontend type re-filtering can exclude valid items.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@src/components/group-study/section/my-participating-studies-section.tsx`
around lines 66 - 70, The current re-filtering using
CLASSIFICATION_TO_STUDY_TYPE and study.type (in the block that builds `filtered`
from `myStudiesData.content`) can exclude legacy items (e.g., type='MENTORING');
remove this additional `study.type === studyType` filter and instead derive
`participatingStudyIds` directly from `myStudiesData.content` (or use the
API-provided classification/studyType that was sent) so all returned content is
preserved; update any downstream usage that references `filtered` to use the
full `myStudiesData.content` (or a properly mapped version) and keep references
to `CLASSIFICATION_TO_STUDY_TYPE`, `studyType`, `myStudiesData.content`, and
`participatingStudyIds` to locate the change.
There was a problem hiding this comment.
회원의 참여 스터디 조회 요청 시(v2)
이렇게 응답이 내려오고 있어.
{
"statusCode": 200,
"timestamp": "2026-04-10T14:14:32.259494826",
"content": {
"content": [
{
"studyId": 62,
"thumbnail": {
"imageId": 80157,
"resizedImages": [
{
"resizedImageId": 157,
"resizedImageUrl": "https://test-api.zeroone.it.kr/images/group-study-thumbnail/a032cb52-d430-4754-b008-e4ddfe563bc3_1775612256117.jpeg",
"imageSizeType": {
"imageTypeName": "ORIGINAL",
"width": null,
"height": null
}
}
]
},
"title": "디자이너",
"maxMembersCount": 6,
"participantsCount": 2,
"startTime": "2026-04-09T00:00:00",
"endTime": "2026-04-16T00:00:00",
"studyRole": "LEADER",
"status": "IN_PROGRESS",
"type": "GROUP_STUDY"
},
{
"studyId": 60,
"thumbnail": {
"imageId": 80155,
"resizedImages": [
{
"resizedImageId": 155,
"resizedImageUrl": "https://test-api.zeroone.it.kr/images/group-study-thumbnail/e132a2de-0487-470a-a1d9-999af98d467b_1775531732165.jpeg",
"imageSizeType": {
"imageTypeName": "ORIGINAL",
"width": null,
"height": null
}
}
]
},
"title": "멘토스터디 테스트",
"maxMembersCount": 11,
"participantsCount": 1,
"startTime": "2026-04-08T00:00:00",
"endTime": "2026-04-15T00:00:00",
"studyRole": "LEADER",
"status": null,
"type": "MENTOR_STUDY"
},
{
"studyId": 59,
"thumbnail": {
"imageId": 80154,
"resizedImages": [
{
"resizedImageId": 154,
"resizedImageUrl": "https://test-api.zeroone.it.kr/images/group-study-thumbnail/7d6bc39a-b94a-4fd3-9174-4e242cfed651_1775480552977.png",
"imageSizeType": {
"imageTypeName": "ORIGINAL",
"width": null,
"height": null
}
}
]
},
"title": "문의삭제를 위한 새로운 스터디 개설",
"maxMembersCount": 2,
"participantsCount": 2,
"startTime": "2026-04-07T00:00:00",
"endTime": "2026-04-13T00:00:00",
"studyRole": "LEADER",
"status": "IN_PROGRESS",
"type": "GROUP_STUDY"
},
{
"studyId": 6,
"thumbnail": null,
"title": null,
"maxMembersCount": 2,
"participantsCount": 2,
"startTime": "2026-04-06T00:00:00",
"endTime": "2026-04-11T00:00:00",
"studyRole": "PARTICIPANT",
"status": "IN_PROGRESS",
"type": "ONE_ON_ONE_STUDY"
},
{
"studyId": 55,
"thumbnail": {
"imageId": 80118,
"resizedImages": [
{
"resizedImageId": 118,
"resizedImageUrl": "https://test-api.zeroone.it.kr/images/group-study-thumbnail/caeadbc4-6543-4811-ab71-b50e0116a31e_1775298990423.webp",
"imageSizeType": {
"imageTypeName": "ORIGINAL",
"width": null,
"height": null
}
}
]
},
"title": "토스 기획",
"maxMembersCount": 5,
"participantsCount": 2,
"startTime": "2026-04-06T00:00:00",
"endTime": "2026-04-11T00:00:00",
"studyRole": "LEADER",
"status": "IN_PROGRESS",
"type": "GROUP_STUDY"
}
],
"page": 1,
"size": 6,
"totalElements": 5,
"totalPages": 1,
"hasNext": false,
"hasPrevious": false
},
"message": null
}
There was a problem hiding this comment.
@HA-SEUNG-JEONG, 공유해 주신 실제 API 응답을 보니 제 코멘트가 잘못되었습니다. 사과드립니다.
응답에 type: "ONE_ON_ONE_STUDY" (studyId: 6) 항목이 포함되어 있는 것처럼, V2 API는 studyType 쿼리 파라미터를 보내도 여러 타입을 혼합하여 반환합니다. 따라서 현재 PR의 study.type === studyType 재필터링은 정확히 필요한 로직입니다 — 이 필터 없이 전체 content를 그대로 사용하면 ONE_ON_ONE_STUDY ID가 participatingStudyIds에 포함되어 하위 필터링에서 잘못된 매칭이 발생할 수 있습니다.
현재 구현이 올바릅니다. 제 코멘트를 무시해 주세요.
✏️ Learnings added
Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 556
File: src/components/group-study/section/my-participating-studies-section.tsx:66-70
Timestamp: 2026-04-10T05:29:23.692Z
Learning: In `code-zero-to-one/study-platform-client`, the V2 member study list API (`useMemberStudyListV2Query`) returns mixed study types in a single response (e.g., GROUP_STUDY, MENTOR_STUDY, ONE_ON_ONE_STUDY) even when a specific `studyType` query parameter is passed. Therefore, the frontend MUST re-filter by `study.type === studyType` when building the `participatingStudyIds` Set in `src/components/group-study/section/my-participating-studies-section.tsx`. Removing this type filter would incorrectly include unrelated study types (like ONE_ON_ONE_STUDY) in the ID set.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
🧠 Learnings used
Learnt from: seong-jin-jo
Repo: code-zero-to-one/study-platform-client PR: 370
File: src/components/section/my-participating-studies-section.tsx:81-89
Timestamp: 2026-02-03T18:49:58.709Z
Learning: The component `src/components/section/my-participating-studies-section.tsx` is a temporary implementation that fetches all studies and filters them client-side against the user's participating study ID set. This approach is used due to the lack of a suitable backend API. The component should be refactored or potentially removed in the future when a proper backend API becomes available.
Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 379
File: src/features/study/group/ui/step/step1-group.tsx:61-65
Timestamp: 2026-02-05T02:17:57.573Z
Learning: In the repository `code-zero-to-one/study-platform-client`, there are existing database records where `classification='GROUP_STUDY'` and `type='MENTORING'`. When editing such records in `src/features/study/group/ui/step/step1-group.tsx`, the form must handle the case where the loaded type value is filtered out from the available options.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/mentoring/ui/registration/mentor-career-entries-editor.tsx:376-376
Timestamp: 2026-03-23T14:43:32.829Z
Learning: In `code-zero-to-one/study-platform-client`, the settlement (정산) feature is intentionally under development and not yet finalized. Do not flag the replacement of settlement verification status (완료/미완료) with placeholder text as a regression — the settlement contract between frontend and backend does not yet exist. This applies to files like `src/features/admin/mentoring/ui/mentor-applications-page-client.tsx`.
Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 441
File: src/types/schemas/group-study-form.schema.ts:30-37
Timestamp: 2026-03-24T06:57:32.892Z
Learning: In `code-zero-to-one/study-platform-client`, the `type` field in `GroupStudyBaseObjectSchema` (defined in `src/types/schemas/group-study-form.schema.ts`) is intentionally required (`z.enum(STUDY_TYPES)`) and must NOT be made optional. When handling legacy records with `type='MENTORING'` (not in STUDY_TYPES), the correct fix is to update the data-mapping function (e.g., `refineStudyDetail()`) to map the invalid value to a valid fallback (e.g., 'PROJECT') rather than `undefined`, so the schema stays strict.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/mentoring/model/mentor-registration-preview.ts:286-294
Timestamp: 2026-03-23T14:43:33.363Z
Learning: In `src/features/mentoring/model/mentor-registration-preview.ts` `getChangedSections`, only `companyName` and `hideCompanyName` need to be compared for the `headline` highlight section — `companyCategory` does NOT affect the headline display in `src/features/mentoring/ui/detail/mentor-detail-page.tsx`.
Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 435
File: src/hooks/common/use-reminder-review.tsx:0-0
Timestamp: 2026-03-21T07:12:53.063Z
Learning: In `code-zero-to-one/study-platform-client`, `StudyReviewModalStateResponse.targetStudySpaceId` is typed as `number` (not `number | null`). Do not suggest `?? undefined` normalization for this field — it is unnecessary as there is no null case in the type.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-pricing-step.constants.ts:25-26
Timestamp: 2026-03-25T19:29:42.728Z
Learning: In `code-zero-to-one/study-platform-client`, `contactEmail` and `contactCountryCode` are legacy dead fields that remain only in schema/model/preview/api mapper code but are no longer exposed in the mentor registration UI. `contactPhone` is still a hidden field written via `setValue('contactPhone', ...)` from identity verification in `use-mentor-registration-controller.ts`. If these dead fields are flagged as missing from merge logic, the correct resolution is to remove them from the frontend entirely rather than restoring them in session draft merge. Do not treat their absence from merge as a Major regression.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-mentor-information-step.tsx:12-12
Timestamp: 2026-03-25T19:29:57.833Z
Learning: In `code-zero-to-one/study-platform-client`, `contactEmail` and `contactCountryCode` are legacy dead fields that only exist in the frontend schema/model/preview/api mapper (e.g., `src/types/schemas/mentor-registration-schema.ts`, `src/features/mentoring/api/mentor-settings.mapper.ts`, `src/features/mentoring/model/use-mentor-registration-preview-model.ts`). They are NOT shown in the registration UI. `contactPhone` is still a live hidden field set via `setValue('contactPhone', ...)` from identity verification results in `src/features/mentoring/model/use-mentor-registration-controller.ts`. Do not flag missing `contactEmail` in merge logic as a Major bug; the correct direction is to remove these dead fields from the frontend entirely.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-schedule-step.tsx:9-9
Timestamp: 2026-03-25T19:29:36.394Z
Learning: In `code-zero-to-one/study-platform-client`, `contactEmail` and `contactCountryCode` are legacy dead fields remaining in `src/types/schemas/mentor-registration-schema.ts`, `src/features/mentoring/api/mentor-settings.mapper.ts`, and `src/features/mentoring/model/use-mentor-registration-preview-model.ts`. There is no UI input for these fields in the current registration form (`src/features/mentoring/ui/registration/step-content/mentor-registration-basic-information-step.tsx`). `contactPhone` is still alive as a hidden saved field updated via `setValue('contactPhone', ...)` from phone verification in the controller. The correct remediation direction for `contactEmail`/`contactCountryCode` is to remove these dead fields from the frontend entirely, not to patch the merge/session draft logic.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-pricing-step.tsx:17-18
Timestamp: 2026-03-25T19:29:35.110Z
Learning: In `code-zero-to-one/study-platform-client`, `contactEmail` and `contactCountryCode` are legacy dead fields that remain only in schema/model/preview/API mapper layers (`src/types/schemas/mentor-registration-schema.ts`, `src/features/mentoring/api/mentor-settings.mapper.ts`, `src/features/mentoring/model/use-mentor-registration-preview-model.ts`). There is no UI input for `contactEmail` in the current registration flow. `contactPhone` is still active as a hidden field populated by the identity verification controller. The appropriate fix direction is to remove the dead `contactEmail`/`contactCountryCode` fields from the frontend entirely, not to treat their absence from session draft merge as a Major bug.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/admin/mentoring/ui/mentor-applications-page-client.tsx:292-292
Timestamp: 2026-03-23T14:42:57.176Z
Learning: In `code-zero-to-one/study-platform-client`, the mentoring apply (`/apply`) flow is intentionally blocked at the product level in the current development stage. `src/features/mentoring/ui/apply/mentoring-apply-route-client.tsx` always renders `MentorRouteUnavailableState` regardless of readiness state, and `src/features/mentoring/ui/detail/mentor-detail-sidebar-cta.tsx` follows the same policy. Do not flag this as a functional regression or bug — it is an intentional product policy.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/admin/mentoring/ui/mentor-applications-page-client.tsx:292-292
Timestamp: 2026-03-23T14:42:57.176Z
Learning: In `code-zero-to-one/study-platform-client`, the settlement (정산) contract/API integration is intentionally not yet implemented. The `settlementDraft` field and its `verified` status on `MentorSettings` should not be treated as a source of truth for settlement readiness. The admin UI in `src/features/admin/mentoring/ui/mentor-applications-page-client.tsx` intentionally shows a placeholder message ("서버 정산 readiness 계약 필요") for the settlement verification field until the server-side settlement contract is established. Do not flag this as a regression.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/mentoring/ui/apply/mentoring-apply-route-client.tsx:80-87
Timestamp: 2026-03-23T14:43:28.726Z
Learning: In `code-zero-to-one/study-platform-client`, the mentoring application flow (`/mentoring/[id]/apply`) is intentionally blocked for all mentors regardless of `isApplicationReady` status. The `/apply` route client (`src/features/mentoring/ui/apply/mentoring-apply-route-client.tsx`) always returns `MentorRouteUnavailableState` with `MENTOR_APPLY_UNSUPPORTED_MESSAGE` as a deliberate product policy while the application submission feature is still under development. Do not flag this as a bug. The sidebar CTA in `src/features/mentoring/ui/detail/mentor-detail-sidebar-cta.tsx` follows the same premise.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 439
File: src/features/mentoring/ui/registration/mentor-career-entries-editor.tsx:376-376
Timestamp: 2026-03-23T14:43:32.829Z
Learning: In `code-zero-to-one/study-platform-client`, the mentoring application (/apply) route is intentionally blocked as a product policy — mentoring applications are not yet supported. Do not flag `src/features/mentoring/ui/apply/mentoring-apply-route-client.tsx` always rendering an unavailable state as a bug; it is deliberate. The same policy is reflected in `src/features/mentoring/ui/detail/mentor-detail-sidebar-cta.tsx`.
Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 415
File: src/components/common/layout/page-container.tsx:14-14
Timestamp: 2026-03-08T13:57:25.733Z
Learning: In this project, treat 'w-7xl' as a valid Tailwind CSS v4 width utility (from the container scale) equivalent to 80rem (1280px). Do not flag 'w-7xl' as non-existent; it is a semantic, preferred replacement for 'w-[1280px]'. Apply this guidance to TSX files across the codebase.
Learnt from: HA-SEUNG-JEONG
Repo: code-zero-to-one/study-platform-client PR: 427
File: src/components/common/ui/avatar-stack.tsx:75-75
Timestamp: 2026-03-16T03:02:43.294Z
Learning: In TSX files, do not flag Tailwind class usages that map to project CSS tokens defined in the global CSS (e.g., --color-gray-200: `#e9eaeb` in src/app/global.css) such as border-gray-200, bg-gray-200, or text-gray-200, since they are intentional custom tokens. Treat these as valid project token usages and avoid false positives. If enforcing, document this as a repository-wide exception and consider an automated check that recognizes token-based class names when a corresponding CSS variable exists in global.css.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-pricing-step.constants.ts:25-26
Timestamp: 2026-03-25T19:29:32.084Z
Learning: In this repository (code-zero-to-one/study-platform-client), do not treat same-folder relative imports (e.g., `./some-module`) as a style violation or major issue. The `@/*` path alias may be used but is optional for intra-feature/local imports; acceptable intra-folder imports include `./...` (and similarly-scoped relative paths) when referencing files in the same directory.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 451
File: src/features/mentoring/ui/registration/step-content/mentor-registration-pricing-step.constants.ts:25-26
Timestamp: 2026-03-25T19:29:32.084Z
Learning: In `code-zero-to-one/study-platform-client`, when reviewing Tailwind class strings that use arbitrary *selector* syntax for styling (e.g., `[appearance:textfield]` or `[&::-webkit-inner-spin-button]:appearance-none` to hide number-input spin buttons), treat it as a style guideline issue (Minor/style) rather than a Major functional bug. Prefer extracting the behavior into a shared utility class (e.g., `no-number-spin`) in the global stylesheet, and use that utility in component class strings instead of repeating the arbitrary selector syntax.
Learnt from: Hyeonjun0527
Repo: code-zero-to-one/study-platform-client PR: 526
File: src/features/community/ui/community-qna-question-card.tsx:103-110
Timestamp: 2026-04-06T07:51:36.931Z
Learning: When using Next.js `<Image>` in this project with user-provided or API-sourced URLs (e.g., image URLs like `previewImage`), validate the URL up front against the allowed hostnames in `next.config.ts` (`remotePatterns`). Prefer pre-render validation/guard logic over relying on the `onError` handler, because `onError` only runs after Next.js rejects the request in the image optimizer. Use a shared guard utility (for example, `isCommunityAllowedImageUrl`) to prevent rendering `<Image>` entirely when the URL’s hostname/domain is not allowed (render a fallback instead).
Summary
status를 재필터링하던 로직 제거status를null로 반환하므로,IN_PROGRESS || RECRUITING조건이 항상false가 되어 참여 중인 MENTOR_STUDY가 목록에서 제외되는 버그 수정status필터링은 API 쿼리 파라미터(NOT_COMPLETED)에서 이미 처리되므로 프론트엔드 재필터링이 불필요함Changes
Bug Fixes
src/components/group-study/section/my-participating-studies-section.tsxparticipatingStudyIds생성 시status조건 제거,type필터만 유지Test plan
🤖 Generated with Claude Code
Summary by CodeRabbit
릴리스 노트